Hyrje ne SQL

SQL vjen nga termat Structured Query Language. Ajo na jep mundesine qe te punojme me bazen e te dhenave. Duke perdorur ate ne mund shtojme, te modifikojme ose te fshijme rekorde nga baza e te dhenave. Mund te shtojme tabela te reja brenda nje databaze, mund te shtojme nje databaze te re ose mund t'i fshijme ato. Per te ekzekutuar SQL-ne na duhet nje sistem per menaxhimin e bazave te te dhenave sic eshte p.sh. MySQL. SQL-ja eshte shume e rendesishme per programuesit te cilet duan te zhvillojne faqe dinamike dhe aplikacione te zgjeruara. Ne shume momente do te na duhet te marrim rekorde nga baza e te dhenave dhe ti shfaqim ato ne faqen ose aplikacionin tone, do te na duhet te shtojme rekorde te reja nepermjet aplikacionit, te modifikojme ose te fshijme rekorde.

Pergjithesisht, nje deklarate SQL nis me nje term qe thekson se cfare do te beje (p.sh. SELECT), me pas thekson se mbi cilin objekt te kryeje veprimin (p.sh. duke perdorur FROM)

SELECT * FROM lexuesit;

Gjithashtu mund te kete nje kusht te vendosur ne fund te deklarates (p.sh. termi WHERE).

SELECT * FROM lexuesit
WHERE emri = 'Alban';

SQL-ja nuk eshte case-sensitive, dmth. nuk ka rendesi nese shkronjat shkruhen kapitale ose jo. Per lehtesi kuptimi shume programues perdorin germat kapitale per komandat e SQL-se dhe germa te vogla per termat e tjere. Nuk ka rendesi sesa hapesire leme ndermjet komandave te SQL-se. P.sh. deklarata e mesiperme mund te shkruhet edhe ne nje rresht te vetem:

SELECT * FROM lexuesit WHERE emri = 'Alban';

Ne fund te cdo deklarate SQL duhet te vendoset nje pikepresje ;. Ne disa raste mund te lejohet edhe pa pikepresje por eshte praktike e duhur qe mos te harrohet pikepresja ne fund te cdo deklarate SQL.

Shembujt qe do te paraqesim ne vijim te ketij seksioni do te jene te bazuara mbi deklaratat qe ekzekutohen ne nje sistem te menaxhimit te te dhenave si MySQL. Ka raste qe disa deklarata varen nga lloji i sistemit, per kete arsye e bej te qarte qe deklaratat e meposhtme pershtaten me sistemin MySQL.

DML & DDL

Data Manipulation Language (DML) - Gjuha per manipulimin e te dhenave

DML na lejon qe te punojme me te dhenat qe gjenden ne databazen tone. DML perdoret per te shtuar, modifikuar, fshire ose per te marre rekorde nga databaza. Shumica e deklaratave SQL qe do te bejme do te filloje me njerin nga termat e meposhtem:

  • SELECT - Merr te dhena nga databaza
  • INSERT - Shton te dhena ne databaze
  • UPDATE - Modifikon te dhena ekzistuese ne databaze
  • DELETE - Fshin te dhena ekzistuese nga databaza

Data Definition Language (DDL) - Gjuha per definimin (organizimin) e te dhenave

Duke perdorur DDL ne mund te krijojme nje tabel te re, mund te fshijme ose modifikojme nje te tille.

Shembuj te komandave DDL:

  • CREATE DATABASE - Krijon nje databaze te re
  • ALTER DATABASE - Modifikon nje databaze
  • DROP DATABASE - Fshin nje databaze
  • CREATE TABLE - Krijon nje tabele te re
  • ALTER TABLE - Modifikon nje tabele
  • DROP TABLE - Fshin nje tabele

SELECT

Deklarata SELECT eshte me e perdorura ne SQL. Ajo thjesht merr te dhena nga databaza.

Shembull:

SELECT * FROM lexuesit;

Me ane te deklarates se mesiperme kerkojme te marrim te gjitha (*) kolonat e tabeles se quajtur lexuesit. Perdorimi i asterisk (*) pas termit SELECT percakton qe deshirojme te gjitha kolonat. Pas ekzekutimit te SQL-se se mesiperme te dhenat e marra do te jene te gjithe rreshtat e tabeles lexusit:

Komanda: SELECT * FROM lexuesit;

id emri adresa celular
1 Alban Afmeti Qyteti Studenti, Tirane 0664064062
2 Drilon Kerxhaliu Ali Demi, Tirane 0662017293
3 Brilant Afmeti Rruga Kavajes, Tirane 0662583993

Per te mos shfaqur te gjitha kolonat por vetem nje pjese te tyre, pas termit SELECT specifikojme emrat e fushave te ndara me presje:

SELECT emri, celular FROM lexuesit;

Komanda: SELECT emri, celular FROM lexuesit;

emri celular
Alban Afmeti 0664064062
Drilon Kerxhaliu 0662017293
Brilant Afmeti 0662583993

Shohim qe do te na kthehen vetem te dhenat qe jemi te interesuar, pra emri dhe celulari i lexuesit. Ne shume raste emrave te fushave u vendoset perpara emri tabeles shoqeruar me nje pike .:

SELECT lexuesit.emri, lexuesit.celular FROM lexuesit;

Kjo behet per arsye se mund te zgjedhim fusha nga dy tabela te ndryshme (do te trajtohet me poshte), dhe duhet te specifikojme se kujt tabele i perket fusha.

Ne shume raste nuk jemi te interesuar per te gjitha rreshtat e tabeles, por vetem per ato rreshta qe plotesojne nje kusht te caktuar. Per te filtruar vetem rreshtat qe duam perdorim termin WHERE i cili na sherben per te vendosur kushte te ndryshme. Termi WHERE vendoset ne fund te deklarates.

SELECT emri, celular FROM lexuesit WHERE celular = '0664064062';

Komanda: SELECT emri, celular FROM lexuesit WHERE celular = '0664064062';

emri celular
Alban Afmeti 0664064062

Me lart kemi perzgjedhur vetem rekordet qe e kane fushen celular te barabarte me 0664064062. Ne kete rast na u kthye vetem nje rekord.

Ne deklaratat SQL per krahasimin e stringave ne vend te operatorit = mund te perdorim operatorin LIKE si ne rastin e meposhtem:

SELECT emri, celular FROM lexuesit WHERE celular LIKE '0664064062';

Ka te njejtin funksion si operatori =, por ne kete rast ne stringen e kushtit WHERE mund te perdorim simbolin % si me poshte:

SELECT emri, celular FROM lexuesit WHERE celular LIKE '066%';

Ne kete rast mjafton qe numri te nise me 066 dhe pjesa tjeter te jete si te doje. Kjo vjen per shkak te perdorimit te simbolit % ne perfundim te stringes. Ky simbol mund te perdoret ne cdo pozicion te stringes dhe nenkupton nje numer karakteresh zero ose me shume.

Ne mund te filtrojme rekordet e nje tabele duke vene me shume se nje kusht me ane te operatoreve te ndryshem. Dy oepratoret me te perdorur jane operatoret AND dhe OR.

Operatori AND

Operatori AND filtron te gjitha rekordet qe plotesojne kushtin e pare dhe kushtin e dyte.

SELECT emri, celular FROM lexuesit WHERE celular = '0664064062' AND emri = 'Drilon Kerxhaliu';

Ne rast se kemi me shume se dy kushte te lidhura me AND, atehere duhet te plotesohen te treja kushtet.

Komanda: SELECT emri, celular FROM lexuesit WHERE celular = '0664064062' AND emri = 'Drilon Kerxhaliu';

emri celular
Drilon Kerxhaliu 0662017293

Operatori OR

Operatori OR filtron te gjitha rekordet qe plotesojne te pakten njerin nga kushtet, pra nje ose me shume kushte te plotesuara.

SELECT emri, celular FROM lexuesit WHERE emri = 'Alban Afmeti' OR emri = 'Drilon Kerxhaliu';

Komanda: SELECT emri, celular FROM lexuesit WHERE emri = 'Alban Afmeti' OR emri = 'Drilon Kerxhaliu';

emri celular
Alban Afmeti 0664064062
Drilon Kerxhaliu 0662017293

IN

Operatori IN na lejon te vendosim vlera te shumefishta ne deklaraten WHERE:

SELECT * FROM lexuesit WHERE emri IN ('Alban Afmeti', 'Drilon Kerxhaliu');

Komanda: SELECT * FROM lexuesit WHERE emri IN ('Alban Afmeti', 'Drilon Kerxhaliu');

id emri adresa celular
1 Alban Afmeti Qyteti Studenti, Tirane 0664064062
2 Drilon Kerxhaliu Ali Demi, Tirane 0662017293

ORDER BY

Duke perdorur deklaratat SELECT ne tabela te ndryshme mund te na kthehen qindra rekorde. Ne disa raste eshte e nevojshme qe keto rekorde ti radhisim bazuar sipas nje fushe. P.sh. rekordet qe marrim nga tabela lexuesit mund ti radhisim sipas emrit:

SELECT * FROM lexuesit ORDER BY emri;

Komanda: SELECT * FROM lexuesit ORDER BY emri;

id emri adresa celular
1 Alban Afmeti Qyteti Studenti, Tirane 0664064062
3 Brilant Afmeti Rruga Kavajes, Tirane 0662583993
2 Drilon Kerxhaliu Ali Demi, Tirane 0662017293

Shohim qe pavaresisht se lexuesi Brilant Afmeti ka id te barabarte me 3 ai renditet i dyti. Kjo ndodh pasi kemi vendosur ti radhisim sipas emrit alfabetikisht. Ne kete rast radhitja eshte ne ngjitje (ascending - ASC) sepse kjo eshte vendosur default nga sistemi i menaxhimit te bazes se te dhenave. Por ne mund ta ndryshojme kete dhe ta bejme qe radhitja te jete ne zbritje (descending - DESC). Mjafton te shtojme termin DESC pas fushes qe behet radhitja.

SELECT * FROM lexuesit ORDER BY emri DESC;

Komanda: SELECT * FROM lexuesit ORDER BY emri DESC;

id emri adresa celular
2 Drilon Kerxhaliu Ali Demi, Tirane 0662017293
3 Brilant Afmeti Rruga Kavajes, Tirane 0662583993
1 Alban Afmeti Qyteti Studenti, Tirane 0664064062

LIMIT

Ka raste kur nje deklarate SQL qe mund te ekzekutojme mund te na ktheje qindra rekorde. Ne mund te jemi te interesuar te marrim vetem 10 rekorde pavaresisht se kushtin WHERE qe ne kemi percaktuar mund ta plotesojne 100 rekorde. Per te marre vetem numrin e rekordeve qe ne duam perdoret termi LIMIT. Ky term percakton numrin e rekordeve maksimal qe nje deklarate SQL duam qe te na ktheje.

Ajo cfare ne te vertete ndodh:

  • Behet nje SELECT per te gjitha rekordet qe plotesojne kushtin WHERE
  • Radhiten rekordet sipas fushes qe kemi percaktuar ne ORDER BY, ose nqs. nuk kemi percaktuar asgje, radhiten sipas nje fushe default te percaktuar nga baza e te dhenave, zakonisht fusha qe eshte PRIMARY KEY
  • Pas radhitjes, kthehet vetem numri i rekordeve qe kemi percaktuar tek termi LIMIT duke ju bazuar radhitjes. Pra, merren rekordet duke filluar nga rekordi i pare pas radhitjes.

Shembull:

SELECT * FROM lexuesit ORDER BY emri DESC LIMIT 2;

Komanda: SELECT * FROM lexuesit ORDER BY emri DESC LIMIT 2;

id emri adresa celular
2 Drilon Kerxhaliu Ali Demi, Tirane 0662017293
3 Brilant Afmeti Rruga Kavajes, Tirane 0662583993

Pavaresisht se kushtin e plotesojne 3 rekorde, jane marre vetem 2 te tilla per shkak te limitit qe kemi vendosur. Ne rast se radhitja do te ishte ASC atehere do te ishin rekorde te tjera. Ne deklaraten SQL eshte opsionale vendosja e radhitjes ASC, pasi eshte default.

Komanda: SELECT * FROM lexuesit ORDER BY emri ASC LIMIT 2;

id emri adresa celular
1 Alban Afmeti Qyteti Studenti, Tirane 0664064062
3 Brilant Afmeti Rruga Kavajes, Tirane 0662583993

OFFSET

Nese vendosim nje limit, merren rekordet duke filluar nga rekordi i pare pas radhitjes. Po sikur te duam qe te merren rekordet duke filluar nga rekordi i dyte, i trete etj.? Na vjen ne ndihme termi OFFSET. Ajo cfare ndodh eshte qe pas radhitjes se rekordeve, tejkalohen aq rekorde sa jane percaktuar tek OFFSET dhe me pas fillon marrja e tyre. P.sh. nqs percaktojme OFFSET 1, rekordi i pare tejkalohet dhe fillon marrja tek rekordi i dyte.

Termi OFFSET duhet gjithmone te para shoqerohet me termin LIMIT. Le te paraqesim nje deklarate normale pa LIMIT dhe OFFSET:

Komanda: SELECT * FROM lexuesit ORDER BY emri;

id emri adresa celular
1 Alban Afmeti Qyteti Studenti, Tirane 0664064062
3 Brilant Afmeti Rruga Kavajes, Tirane 0662583993
2 Drilon Kerxhaliu Ali Demi, Tirane 0662017293

Le te shtojme LIMIT 2 dhe OFFSET 2:

Komanda: SELECT * FROM lexuesit ORDER BY emri LIMIT 2 OFFSET 1;

id emri adresa celular
3 Brilant Afmeti Rruga Kavajes, Tirane 0662583993
2 Drilon Kerxhaliu Ali Demi, Tirane 0662017293

Shohim qe eshte tejkaluar rekordi i pare me id = 1, fillon numerimi nga rekordi i dyte dhe merren dy rekordet e radhes meqe eshte percaktuar LIMIT 2.

Alias-et

Kur emri i nje tabele eshte shume i gjate, ne mund te perdorim nje alias, qe eshte nje emer i dyte qe ne i vendosim tabeles per ta perdorur ne deklaratat SQL qe po ndertojme.

SELECT * FROM lexuesit AS lex;

ose

SELECT lex.emri, lex.adresa FROM lexuesit AS lex;

JOINS

Per te marre te dhena nga dy tabela te ndryshme perdoren deklaratat SQL me bashkimet JOIN. Ne seksionin qe shpjeguam se cfare jane databazat relacionale paraqitem dy tabela lexuesit dhe librat te cilat i riparaqesim te lidhura me relacion One-to-many:

Tabela: lexuesit

id emri adresa celular
1 Alban Afmeti Qyteti Studenti, Tirane 0664064062
2 Drilon Kerxhaliu Ali Demi, Tirane 0662017293
3 Brilant Afmeti Rruga Kavajes, Tirane 0662583993
4 Arber Lami Rruga Dibres, Tirane 0662583777

Tabela: librat

id libri data_kthimit id_lexues
1 "Advanced PHP" 2017-05-01 1
2 "Web Programming" 2017-06-02 2
3 "PHP Performance" 2017-05-12 1
4 "Social Life" 2017-06-12 3
5 "PHP Cookbook" 2017-06-03 1
6 "Advanced SQL" 2017-06-12 1

Nje lexues mund te kete marre zero ose me shume libra. Ne tabelen librat fusha id_lexues percakton se cili lexues ka marre librin ne fjale.

Do te trajtojme dy tipe te deklaratave JOIN:

  • INNER JOIN - Kthen nje liste me rekorde te cilat nje rekord ne tabelen e pare ka te pakten nje korrespondues ne tabelen e dyte dhe anasjelltas. Ne rast se nje rekord ne tabelen e pare nuk ka korrespondues ne tabelen e dyte ai nuk kthehet. Po ashtu, ne rast se nje rekord ne tabelen e dyte nuk ka korrespondues me ndonje rekord ne tabelen e pare ai nuk kthehet.
SELECT * FROM lexuesit
INNER JOIN librat
ON lexuesit.id = librat.id_lexues;

Ekziston nje kusht ne bashkimet JOIN te cilat i lidh tabelat ndermjet tyre, gjen korrespondencen ndermjet rekordeve. Ky kusht vjen pas termit ON: ON lexuesit.id = librat.id_lexues. Pra, behet nje bashkim i rekordeve qe plotesojne kushtin qe id-ja e lexuesit te jete e barabarte me celesin e jashtem id_lexues te tabeles librat. Ne kete rast rekordet qe do te na kthehen do te jene:

id emri adresa celular id libri data_kthimit id_lexues
1 Alban Afmeti Qyteti Studenti, Tirane 0664064062 1 "Advanced PHP" 2017-05-01 1
1 Alban Afmeti Qyteti Studenti, Tirane 0664064062 3 "PHP Performance" 2017-05-12 1
1 Alban Afmeti Qyteti Studenti, Tirane 0664064062 5 "PHP Cookbook" 2017-06-03 1
1 Alban Afmeti Qyteti Studenti, Tirane 0664064062 6 "Advanced SQL" 2017-06-12 1
2 Drilon Kerxhaliu Ali Demi, Tirane 0662017293 2 "Web Programming" 2017-06-02 2
3 Brilant Afmeti Rruga Kavajes, Tirane 0662583993 4 "Social Life" 2017-06-12 3

Dukeqenese kemi bere nje INNER JOIN, rekordi i lexuesit Arber Lami nuk eshte shfaqur ne liste sepse ai nuk ka korrespondent ne tabelen librat.

Ne kete moment rekordet e kthyera jane thjeshte pergjigja qe na jep SQL-ja, dhe nuk duhet menduar si perseritje te dhenash. Te dhenat ne memorie ruhen te paperseritura, por eshte SQL-ja ajo qe na i paraqet ne forme te zgjeruar ne momentin qe ne ekzekutojme deklarata te tilla. Shohim qe na jane shfaqur kolonat e dy tabelave sebashku. Pra fushat id, emri, adresa, celular e tabeles lexuesit dhe fushat id, libri, data_kthimit, id_lexues e tabeles librat. Duke qene se kemi dy fusha me emer te njejte id, shpeshhere kjo na jep problem ne momentin qe i referohemi fushave, pasi nuk eshte e qarte nese po i referohemi fushes se pare id apo fushes tjeter. Per kete arsye ne deklaratat SQL duhet te specifikojme se cilat fusha te kthehen pas ekzekutimit:

SELECT lex.id, lex.emri, lib.libri, lib.data_kthimit FROM lexuesit AS lex
INNER JOIN librat AS lib
ON lexuesit.id = librat.id_lexues;

Ne deklaraten e mesiperme kemi perdorur konceptin e alias-eve per te shkurtuar emrin e tabelave ne menyre qe kur te perzgjedhim fushat qe do te na kthehen, t'a kemi me te lehte. Ne kete rast kam perzgjedhur fushat id dhe emri te tabeles lexuesit, pra lex.id, lex.emri dhe fusha libri dhe data_kthimit per tabelen librat, pra lib.libri, lib.data_kthimit.

Rezultati qe do te na kthehet pas ekzekutimit te deklarates:

id emri libri data_kthimit
1 Alban Afmeti "Advanced PHP" 2017-05-01
1 Alban Afmeti "PHP Performance" 2017-05-12
1 Alban Afmeti "PHP Cookbook" 2017-06-03
1 Alban Afmeti "Advanced SQL" 2017-06-12
2 Drilon Kerxhaliu "Web Programming" 2017-06-02
3 Brilant Afmeti "Social Life" 2017-06-12
  • LEFT JOIN - Kthen nje liste me rekorde te tabeles se pare, duke i bashkangjitur ne krah korresponduesit qe kane ne tabelen e dyte. Edhe ne rast se nje rekord ne tabelen e pare nuk ka korrespondues ne tabelen e dyte ai do te listohet.
SELECT * FROM lexuesit
LEFT JOIN librat
ON lexuesit.id = librat.id_lexues;

Rezultati i kthyer:

id emri adresa celular id libri data_kthimit id_lexues
1 Alban Afmeti Qyteti Studenti, Tirane 0664064062 1 "Advanced PHP" 2017-05-01 1
2 Drilon Kerxhaliu Ali Demi, Tirane 0662017293 2 "Web Programming" 2017-06-02 2
1 Alban Afmeti Qyteti Studenti, Tirane 0664064062 3 "PHP Performance" 2017-05-12 1
3 Brilant Afmeti Rruga Kavajes, Tirane 0662583993 4 "Social Life" 2017-06-12 3
1 Alban Afmeti Qyteti Studenti, Tirane 0664064062 5 "PHP Cookbook" 2017-06-03 1
1 Alban Afmeti Qyteti Studenti, Tirane 0664064062 6 "Advanced SQL" 2017-06-12 1
4 Arber Lami Rruga Dibres, Tirane 0662583777 (NULL) (NULL) (NULL) (NULL)

Te gjitha kolonat e te dyja tabelave bashkohen ne varesi te korrespondences qe kane, pra id e tabeles lexuesit te jete e barabarte me id_lexues te tabeles librat, sepse ky eshte edhe kushti i bashkimit ON lexuesit.id = librat.id_lexues;. Arsyeja e listimit te te gjitha kolonave eshte sepse ne deklarate kemi perdorur asterisk SELECT *. Ne kete rast edhe pse rekordi me lexuesin Arber Lami nuk ka korrespondent ne tabelen librat, ai shfaqet i listuar. Dukeqenese nuk ka korrespondet ne tabelen e dyte, fushat e tabeles se dyte qe ju bashkangjiten te pares marrin vleren NULL per kete rekord.

INSERT

Deklaratat INSERT sherbejne per te shtuar te dhena ne bazen e te dhenave. Me ane te komandes INSERT mund te shtojme nje rekord te ri ne nje tabele te databazes.

INSERT INTO lexuesit
VALUES ( '5', 'Leart Gjoni', 'Brryli, Tirane', '0664435948' );

Pasi te ekzekutohet komanda e mesiperme ne tabele do te shtohet nje rekord i ri. Ekzekutojme komanden SELECT per te pare rekordet e tabeles:

Komanda: SELECT * FROM lexuesit;

id emri adresa celular
1 Alban Afmeti Qyteti Studenti, Tirane 0664064062
2 Drilon Kerxhaliu Ali Demi, Tirane 0662017293
3 Brilant Afmeti Rruga Kavajes, Tirane 0662583993
4 Arber Lami Rruga Dibres, Tirane 0662583777
5 Leart Gjoni Brryli, Tirane 0664435948

Ne rastin e mesiperm pas termit VALUES ne specifikuam te gjitha vlerat qe do te kene fushat per rekordin e ri ( '5', 'Leart Gjoni', 'Brryli, Tirane', '0664435948' ) respektivisht id, emri, adresa, celular.

Ne disa raste mund te duam qe te specifikojm vetem nje pjese te vlerave per disa fusha specifike:

INSERT INTO lexuesit (emri, adresa)
VALUES ( 'Gentjan Afmeti', 'Blloku, Tirane' );

Ne kete rast vlerat e specifikuara nga ne 'Gentjan Afmeti', 'Blloku, Tirane' do ti kalohen respektivisht fushave emri, adresa te deklaruara brenda kllapave qe vijne pas emrit te tabeles. Le te shohim rekordin e shtuar:

Komanda: SELECT * FROM lexuesit;

id emri adresa celular
1 Alban Afmeti Qyteti Studenti, Tirane 0664064062
2 Drilon Kerxhaliu Ali Demi, Tirane 0662017293
3 Brilant Afmeti Rruga Kavajes, Tirane 0662583993
4 Arber Lami Rruga Dibres, Tirane 0662583777
5 Leart Gjoni Brryli, Tirane 0664435948
6 Gentjan Afmeti Blloku, Tirane (NULL)

Shohim qe fusha id eshte gjeneruar automatikisht me vleren 6. Kjo ndodh kur nje PRIMARY KEY sic eshte id ne kete rast e vendosim me opsionin AUTOINCREMENT. Dukeqenese id duhet te jete unike, opsioni AUTOINCREMENT gjeneron nje numer unik ne fushen id per rekordin ne fjale, duke inkrementuar pas cdo shtimi te nje rekordi te ri. Meqenese nuk percaktuam nje vlere per fushen celular, ajo do te marre vleren NULL.

Komanda INSERT perdoret vetem kur duam te shtojme rekorde te reja ne nje tabele. Per modifikime te nje rekordi ekzistues duhet te perdorim komanden UPDATE.

UPDATE

Deklaratat UPDATE sherbejne per te modifikuar te dhena ekzistuese ne bazen e te dhenave. Me ane te komandes UPDATE mund te modifikojme rekorde ekzistuese ne nje tabele te databazes. Kjo komande perdor kushtin WHERE per te percaktuar kushtin se cilat rekorde do te modifikohen. Ne rast se nuk percaktojme nje kusht WHERE do te modifikohen te gjitha rekordet.

UPDATE lexuesit
SET celular = '0662222222'
WHERE id = 1;

Pasi te ekzekutohet komanda e mesiperme ne tabele do te modifikohet rekordi qe e ka id-ne te barabarte me 1. Ekzekutojme komanden SELECT per te pare te dhenat e ndryshuara:

Komanda: SELECT * FROM lexuesit;

id emri adresa celular
1 Alban Afmeti Qyteti Studenti, Tirane 0662222222
2 Drilon Kerxhaliu Ali Demi, Tirane 0662017293
3 Brilant Afmeti Rruga Kavajes, Tirane 0662583993
4 Arber Lami Rruga Dibres, Tirane 0662583777
5 Leart Gjoni Brryli, Tirane 0664435948
6 Gentjan Afmeti Blloku, Tirane (NULL)

Modifikimi eshte kryer me sukses. Fusha celular per rekordin me id = 1 eshte ndryshuar ne 0662222222.

Mund te modifikojme edhe disa fusha njeheresh, mjafton qe ti ndajme fushat me presje ,.

UPDATE lexuesit
SET adresa = 'Nentkateshet, Tirane', celular = '0663333333'
WHERE id = 6;

Pasi te ekzekutohet komanda e mesiperme ne tabele do te modifikohet rekordi qe e ka id-ne te barabarte me 6. Ekzekutojme komanden SELECT per te pare te dhenat e ndryshuara:

Komanda: SELECT * FROM lexuesit;

id emri adresa celular
1 Alban Afmeti Qyteti Studenti, Tirane 0662222222
2 Drilon Kerxhaliu Ali Demi, Tirane 0662017293
3 Brilant Afmeti Rruga Kavajes, Tirane 0662583993
4 Arber Lami Rruga Dibres, Tirane 0662583777
5 Leart Gjoni Brryli, Tirane 0664435948
6 Gentjan Afmeti Nentkateshet, Tirane 0663333333

Po ashtu edhe kushti WHERE mund te zgjerohet duke perdorur fusha te ndryshme me operatoret AND dhe OR.

DELETE

Deklarata DELETE na jep mundesine qe te fshijme rekorde nga nje tabele e databazes. Edhe ne kete rast specifikojme nje kusht WHERE per te percaktuar se cilat rekorde do te fshihen. Ne rast se kushti WHERE nuk specifikohet atehere te gjitha rekordet do te fshihen, gje e cila eshte e rrezikshme dhe duhet patur kujdes.

DELETE FROM lexuesit
WHERE id = '4';

Pasi te ekzekutohet komanda e mesiperme ne tabele do te fshihet rekordi qe e ka id-ne te barabarte me 4. Ekzekutojme komanden SELECT per te pare rekordet ekzistuese:

id emri adresa celular
1 Alban Afmeti Qyteti Studenti, Tirane 0662222222
2 Drilon Kerxhaliu Ali Demi, Tirane 0662017293
3 Brilant Afmeti Rruga Kavajes, Tirane 0662583993
4 Arber Lami Rruga Dibres, Tirane 0662583777
5 Leart Gjoni Brryli, Tirane 0664435948
6 Gentjan Afmeti Nentkateshet, Tirane 0663333333

Rekordi qe eshte paraqitur me vizen nuk do te shfaqet ne databaze pas fshirjes:

id emri adresa celular
1 Alban Afmeti Qyteti Studenti, Tirane 0662222222
2 Drilon Kerxhaliu Ali Demi, Tirane 0662017293
3 Brilant Afmeti Rruga Kavajes, Tirane 0662583993
5 Leart Gjoni Brryli, Tirane 0664435948
6 Gentjan Afmeti Nentkateshet, Tirane 0663333333

Dallojme qarte qe nuk ekziston nje rekord me id = 4.

COUNT(*)

Ne rast se duam te shikojme thjeshte sesa rekorde jane ne tabele (duke mos marre rekordet, por numrin e tyre), ne mund te perdorim COUNT(*). COUNT(*) numeron te gjitha rekordet pavaresisht se cfare vlere kane ata.

SELECT COUNT(*) FROM lexuesit;

Komanda: SELECT COUNT(*) FROM lexuesit;

count(*)
5

Vendosim nje alias per emrin e fushes qe do te gjenerohet nga COUNT(*):

Komanda: SELECT COUNT(*) AS numri_rekordeve FROM lexuesit;

numri_rekordeve
5

Ne nje nga shembujt e mesiperm trajtuam rastin kur nje fushe ne tabele mund te kete edhe vleren NULL, si ne rastin e meposhtem:

id emri adresa celular
1 Alban Afmeti Qyteti Studenti, Tirane 0662222222
2 Drilon Kerxhaliu Ali Demi, Tirane 0662017293
3 Brilant Afmeti Rruga Kavajes, Tirane 0662583993
4 Arber Lami Rruga Dibres, Tirane 0662583777
5 Leart Gjoni Brryli, Tirane 0664435948
6 Gentjan Afmeti Blloku, Tirane (NULL)

Ne rast se ekzekutojme komanden:

Komanda: SELECT COUNT(*) AS numri_rekordeve FROM lexuesit;

numri_rekordeve
6

Do te na kthehet rezultati 6, pasi ne te vertete ne tabele ekzistojne 6 rekorde. Per te numeruar te gjitha rekordet qe nje kolone te caktuar nuk e kane me vlere NULL perdorim COUNT(emri_fushes), ku emri_fushes duhet te zevendesohet me emrin e kolones mbi te cilen do te behet numerimi.

Shembull:

Komanda: SELECT COUNT(celular) AS numri_rekordeve FROM lexuesit;

numri_rekordeve
5

Ne kete rast u kthye rezultati 5, pasi edhe pse ne tabele ekzistojne 6 rekorde, rekordi i fundit e ka me vlere NULL fushen celular, mbi te cilen u krye numerimi.

CREATE

Per te krijuar nje baze te dhenash perdorim komanden CREATE DATABASE. P.sh. nese duam te krijojme nje baze te dhenash me emer libraria, perdorim komanden e meposhtme:

CREATE DATABASE libraria;

Per te krijuar nje tabele perdorim komanden CREATE TABLE.

CREATE TABLE emri_tabeles
(
    kolona_1 tipi,
    kolona_2 tipi,
    ...
);

Per te krijuar tabelen lexuesit eshte perdorur komanda e meposhtme:

CREATE TABLE lexuesit
(    
    id int,
    emri varchar(50),
    adresa varchar(80),
    celular varchar(15)
);

Per te specifikuar se cila kolone do te jete PRIMARY KEY dhe AUTOINCREMENT:

CREATE TABLE lexuesit
(    
    id int AUTO_INCREMENT,
    emri varchar(50),
    adresa varchar(80),
    celular varchar(15),

    PRIMARY KEY (id)
);

Ne disa raste nuk duam qe ndonje kolone te pranoje vleren NULL, p.sh. fusha id nuk duhet te jete kurre NULL sepse eshte celesi primar. Po ashtu edhe emri i lexuesit nuk duhet te jete kurre NULL sepse nuk do te kishte kuptim, dhe nuk do te arrinim te identifikonim se per ke lexues e ka fjalen.

CREATE TABLE lexuesit
(    
    id int NOT NULL AUTO_INCREMENT,
    emri varchar(50) NOT NULL,
    adresa varchar(80),
    celular varchar(15),

    PRIMARY KEY (id)
);

Ne seksionin ku kemi folur per databazat relacionale, kemi permendur konceptin e FOREIGN KEY, celes i jashtem i nje tabele qe referencon nje tabele tjeter. P.sh. fusha id_lexues e tabeles librat eshte nje celes i jashtem qe per cdo rekord te tabeles librat referencon nje rekord te tabeles lexuesit. Nje FOREIGN KEY mund ta krijojme si me poshte ne momentin e krijimit te nje tabele:

CREATE TABLE librat
(    
    id int NOT NULL AUTO_INCREMENT,
    libri varchar(80) NOT NULL,
    data_kthimit date,
    id_lexues int,

    PRIMARY KEY (id),
    FOREIGN KEY (id_lexues) REFERENCES lexuesit(id)
);

Pjesa FOREIGN KEY (id_lexues) REFERENCES lexuesit(id) tregon qe fusha id_lexues do te jete celes i jashtem dhe referencon fushen id te tabeles lexuesit.

Tipet e te dhenave

Kur krijojme nje tabel, per cdo kolone na duhet te percaktojme tipin e te dhenave qe do te mbaje, si ne rastin:

CREATE TABLE lexuesit
(    
    id int,
    emri varchar(50),
    adresa varchar(80),
    celular varchar(15)
);

Kemi percaktuar tipin int per fushen id dukeqenese do te mbaje nje numer (pa presje dhjetore). Kemi percaktuar tipin varchar per fushen emri sepse do te mbaje nje tekst. Numri ne kllapa qe vjen pas termit varchar paraqet numrin maksimal te karaktereve qe do te kete fusha ne databaze.

Vec ketyre dy tipeve te dhenash, sistemet per menaxhimin e bazave te te dhenave ofrojne nje liste te gjate te tyre. Listojme me poshte nder tipet me te perdorura:

  • int - Mban nje vlere numerike te plote
  • float ose double - Mban nje numer me presje dhjetore

  • date - Mban nje date te tipit viti-muaj-dita p.sh. 2017-02-02

  • datetime - Mban daten dhe oren te tipit viti-muaj-dita ore:minuta:sekonda p.sh. 2017-02-02 07:20:25

  • text - Mban nje tekst te gjate

  • varchar - Mban maksimumi nje tekst me madhesi aq sa e specifikojme. Ka nje limit. Per tekste shume te gjata perdorim tipin text
  • char - Mban tekst deri ne 255 karaktere

Vlerat DEFAULT

Mund te na duhet qe per disa fusha te specifikojme nje vlere default, qe ne rastin kur shtojme rekorde dhe nuk specifikojme nje vlere per fushen ne fjale, atehere ajo te marre vleren default.

CREATE TABLE Punonjesit
(
    id int NOT NULL,
    emri varchar(100) NOT NULL,
    qyteti varchar(100) DEFAULT 'Tirane'
)

Ne deklarimin e fushes qyteti kemi perdorur termin DEFAULT 'Tirane' e cila vendos nje vlere default per kete fushe, ne rastet qe per te nuk jepet vlere nga perdoruesi (kur shtohet rekord i ri).

results matching ""

    No results matching ""